package com.springboot.system.service;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.springframework.stereotype.Service;

import com.alibaba.fastjson.JSONObject;
import com.springboot.system.domain.auth.UserInfo;
import com.springboot.system.domain.online.OnlineUser;
import com.springboot.system.domain.online.OnlineUserFilter;
import com.springboot.common.utils.BeanUtils;
import com.springboot.common.utils.CollocationUtils;
import com.springboot.common.utils.StringUtils;
import com.springboot.core.AuthUserHolder;
import com.springboot.core.SysManager;
import com.springboot.core.web.mvc.Page;

@Service
public class OnlineUserService {

	public List<OnlineUser> getAll() {
		List<String> keyList = SysManager.getRedis().keys(AuthUserHolder.userKey("") + "*");
		if (keyList == null || keyList.isEmpty()) {
			return null;
		}

		List<OnlineUser> onlineUserList = new ArrayList<OnlineUser>();

		OnlineUser onlineUser;
		for (String key : keyList) {
			UserInfo user = JSONObject.parseObject(SysManager.getRedis().get(key), UserInfo.class);
			if (user != null) {
				onlineUser = new OnlineUser();
				BeanUtils.copyObject(onlineUser, user);

				onlineUser.setIp(user.getClientInfo().getIp());
				onlineUser.setLoginTime(user.getClientInfo().getLoginTime());
				onlineUserList.add(onlineUser);
			}
		}
		return onlineUserList;
	}

	public List<OnlineUser> filter(String filter) {
		List<OnlineUser> onlineUserList = getAll();
		if (onlineUserList == null || onlineUserList.isEmpty()) {
			return null;
		}

		if (StringUtils.isNotBlank(filter)) {
			List<OnlineUser> filterList = new ArrayList<OnlineUser>();
			for (OnlineUser onlineUser2 : onlineUserList) {
				if (onlineUser2.toString().contains(filter)) {
					filterList.add(onlineUser2);
				}
			}
			onlineUserList = filterList;
		}
		return onlineUserList;
	}

	public Page<OnlineUser> onlineUser(OnlineUserFilter filter) {

		List<OnlineUser> onlineUserList = filter(filter.getFilter());
		if (onlineUserList == null || onlineUserList.isEmpty()) {
			return null;
		}
		Collections.sort(onlineUserList, (s1, s2) -> s2.getLoginTime().compareTo(s1.getLoginTime()));

		List<OnlineUser> onlineUserListPage = CollocationUtils.searchList(onlineUserList, filter.getPage() - 1,
				filter.getLimit());

		Page<OnlineUser> page = new Page<OnlineUser>(onlineUserListPage, onlineUserList.size(), filter.getLimit(),
				filter.getPage());
		return page;
	}

	public void kickoutByToken(String token) {
		if (StringUtils.isBlank(token)) {
			return;
		}
		AuthUserHolder.destroyUser(token);

	}

	public void kickoutByUId(String uid) {
		if (StringUtils.isBlank(uid)) {
			return;
		}

		List<OnlineUser> onlineUserList = filter(uid);
		if (onlineUserList == null || onlineUserList.isEmpty()) {
			return;
		}

		for (OnlineUser onlineUser : onlineUserList) {
			if (onlineUser.getUid().equals(uid)) {
				kickoutByToken(onlineUser.getToken());
			}
		}

	}

}
